package com.liu.tools;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Hashtable;

import javax.imageio.ImageIO;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

/**
 * @DateTime 2016年2月17日上午10:36:16
 * @Company 中国建装
 * @Author 刘兴密
 * @QQ 63972012
 * @Desc 二维码生成工具
 */
public class QRCodeUtil {
	
	private static final int BLACK = 0xFF000000;

	private static final int WHITE = 0xFFFFFFFF;

	public static BufferedImage toBufferedImage(BitMatrix matrix) {

		int width = matrix.getWidth();

		int height = matrix.getHeight();

		BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

		for (int x = 0; x < width; x++) {

			for (int y = 0; y < height; y++) {

				image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);

			}

		}

		return image;

	}

	public static void writeToFile(BitMatrix matrix, String format, File file)

	throws IOException {

		BufferedImage image = toBufferedImage(matrix);

		if (!ImageIO.write(image, format, file)) {

			throw new IOException("Could not write an image of format "	+ format + " to " + file);

		}

	}

	public static void writeToStream(BitMatrix matrix, String format, OutputStream stream) throws IOException {

		BufferedImage image = toBufferedImage(matrix);

		if (!ImageIO.write(image, format, stream)) {

			throw new IOException("Could not write an image of format " + format);

		}

	}

	public static void buliderQRCode(int width, int height, String imgFormat, String data, OutputStream stream) throws Exception {

		Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
		hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
		
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);  
        hints.put(EncodeHintType.MARGIN, 1);  
		
		BitMatrix bitMatrix = new MultiFormatWriter().encode(data, BarcodeFormat.QR_CODE, width, height, hints);

		writeToStream(bitMatrix, imgFormat, stream);
	}
}
